/***************************************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved. This program and the
 * accompanying materials are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: IBM Corporation - initial API and implementation
 **************************************************************************************************/
package org.eclipse.swt.snippets;

import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.*;

/**
 * Region snippet: Create non-rectangular shell from an image with transparency
 * 
 * For a list of all SWT example snippets see http://www.eclipse.org/swt/snippets/
 * 
 * @since 3.2
 */
public class Snippet219
{
	public static void main( String[] args )
	{

		final Display display = new Display();
		final Image image = display.getSystemImage( SWT.ICON_INFORMATION );
		final Shell shell = new Shell( display, SWT.NO_TRIM );
		Region region = new Region();
		final ImageData imageData = image.getImageData();
		if( imageData.alphaData != null )
		{
			Rectangle pixel = new Rectangle( 0, 0, 1, 1 );
			for( int y = 0; y < imageData.height; y++ )
			{
				for( int x = 0; x < imageData.width; x++ )
				{
					if( imageData.getAlpha( x, y ) == 255 )
					{
						pixel.x = imageData.x + x;
						pixel.y = imageData.y + y;
						region.add( pixel );
					}
				}
			}
		} else
		{
			ImageData mask = imageData.getTransparencyMask();
			Rectangle pixel = new Rectangle( 0, 0, 1, 1 );
			for( int y = 0; y < mask.height; y++ )
			{
				for( int x = 0; x < mask.width; x++ )
				{
					if( mask.getPixel( x, y ) != 0 )
					{
						pixel.x = imageData.x + x;
						pixel.y = imageData.y + y;
						region.add( pixel );
					}
				}
			}
		}
		shell.setRegion( region );

		Listener l = new Listener()
		{
			int startX, startY;
			public void handleEvent( Event e )
			{

				if( e.type == SWT.KeyDown && e.character == SWT.ESC )
				{
					shell.dispose();
				}
				if( e.type == SWT.MouseDown && e.button == 1 )
				{
					startX = e.x;
					startY = e.y;
				}
				if( e.type == SWT.MouseMove && ( e.stateMask & SWT.BUTTON1 ) != 0 )
				{
					Point p = shell.toDisplay( e.x, e.y );
					p.x -= startX;
					p.y -= startY;
					shell.setLocation( p );
				}
				if( e.type == SWT.Paint )
				{
					e.gc.drawImage( image, imageData.x, imageData.y );
				}
			}
		};
		shell.addListener( SWT.KeyDown, l );
		shell.addListener( SWT.MouseDown, l );
		shell.addListener( SWT.MouseMove, l );
		shell.addListener( SWT.Paint, l );

		shell.setSize( imageData.x + imageData.width, imageData.y + imageData.height );
		shell.open();
		while( !shell.isDisposed() )
		{
			if( !display.readAndDispatch() )
				display.sleep();
		}
		region.dispose();
		image.dispose();
		display.dispose();
	}
}
